/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package fonol.facades;

import fonol.entidades.Delegados;
import fonol.entidades.Estados;
import fonol.entidades.Gobiernos;
import fonol.entidades.Proyectos;
import java.util.List;
import java.util.logging.Logger;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;

/**
 *
 * @author Fredfred2
 */
@Stateless
public class DelegadosFacade implements DelegadosFacadeRemote {
    @PersistenceContext
    private EntityManager em;

    public void create(Delegados delegados) {
        em.persist(delegados);
    }

    public void edit(Delegados delegados) {
        em.merge(delegados);
    }

    public void remove(Delegados delegados) {
        em.remove(em.merge(delegados));
    }

    public Delegados find(Object id) {
        return em.find(fonol.entidades.Delegados.class, id);
    }

    public List<Delegados> findAll() {
        return em.createQuery("select object(o) from Delegados as o").getResultList();
    }

    public boolean actualiza(Delegados delegadoWeb) {
        Delegados delegadoBase=find(delegadoWeb.getIddelegado());
        if((delegadoBase.getPresupuesto().doubleValue()>=delegadoWeb.getPresupuesto().doubleValue())){
            delegadoWeb.setIdestado(delegadoBase.getIdestado());
            delegadoWeb.setPresupuesto(delegadoBase.getPresupuesto());
            delegadoWeb.setIdusuario(delegadoBase.getIdusuario());
            em.merge(delegadoWeb);
            logea("Delegadosfacade.actualiza.true");
            return true;
        }
        if((delegadoBase.getPresupuesto().doubleValue()<delegadoWeb.getPresupuesto().doubleValue())&&verificaPresupuesto(delegadoBase,delegadoWeb)){
            em.merge(delegadoWeb);
            logea("Delegadosfacade.actualiza.true");
            return true;
        }
        logea("Delegadosfacade.actualiza.false");
        return false;
    }

    private boolean verificaPresupuesto(Delegados delegadoBase, Delegados delegadoWeb) {
        Gobiernos gob=delegadoBase.getIdestado().getIdgobierno();
        logea("Delegadosfacade.verificaPresupuesto.gobierno:"+gob);
        Double diferencia=delegadoWeb.getPresupuesto().doubleValue()-delegadoBase.getPresupuesto().doubleValue();
        Double presupuestoUtilizado=0.0;
        List<Delegados> delegadoses=em.createQuery("select d from Delegados d").getResultList();
        for(Delegados d:delegadoses){
            presupuestoUtilizado+=regresaPresupuestoUtilizado(d.getIdestado());
        }
        Double totalPrevisto=presupuestoUtilizado+diferencia;
        logea("gob.getPib().doubleValue()"+gob.getPib().doubleValue());
        if(totalPrevisto<=gob.getPib().doubleValue())
            return true;
        return false;
    }
    
    public boolean verificaPresupuestoAntesAsignar(Delegados delegadoWeb) {
        Gobiernos gob=(Gobiernos) em.createQuery("select o from Gobiernos o where o.idgobierno=:idgobierno").setParameter("idgobierno", 1).getSingleResult();
        logea("Delegadosfacade.verificaPresupuesto.gobierno:"+gob);
        Double diferencia=delegadoWeb.getPresupuesto().doubleValue();
        Double presupuestoUtilizado=0.0;
        List<Delegados> delegadoses=em.createQuery("select d from Delegados d").getResultList();
        for(Delegados d:delegadoses){
            presupuestoUtilizado+=regresaPresupuestoUtilizado(d.getIdestado());
        }
        Double totalPrevisto=presupuestoUtilizado+diferencia;
        logea("gob.getPib().doubleValue()"+gob.getPib().doubleValue());
        if(totalPrevisto<=gob.getPib().doubleValue())
            return true;
        return false;
    }
    
    public double regresaPresupuestoUtilizado(Estados estado) {
        double presupuestoActual=0;
        String query=
                "select p.idproyecto as idproyecto,p.presupuesto as presupuesto " +
                "from proyectos p " +
                "inner join beneficiarios b on p.idbeneficiario=b.idbeneficiario " +
                "inner join candidatos c on c.idcandidato=b.idcandidato " +
                "inner join estados e on e.idestado=c.idestado " +
                "where " +
                "e.idestado="+estado.getIdestado()+" and " +
                "p.estatus=0";
        List<Proyectos> proys= em.createNativeQuery(query,"ProyectosResult").getResultList();
        for(Proyectos p:proys)
            presupuestoActual+=p.getPresupuesto().doubleValue();
        
        logea(presupuestoActual+"");
        return presupuestoActual;
        
    }
    
    
    private void logea(String m){
        Logger log=Logger.getLogger(DelegadosFacade.class.getName());
        log.info(m);
    }


}
